{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6a6a7ea3-e27b-43f3-a53c-9c8a4eb9ec7a",
   "metadata": {},
   "source": [
    "# Graph Cut search problem with Grover Oracle"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5193de81-389e-4a87-89dc-1acb2f2630e0",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "\n",
    "The \"Maximum Cut Problem\" (MaxCut) [[1](#MaxCutWiki)] is an example of combinatorial optimization problem. It refers to finding a partition of a graph into two sets, such that the number of edges between the two sets is maximal.\n",
    "\n",
    "## Mathematical formulation\n",
    "\n",
    "Given a graph $G=(V,E)$ with $|V|=n$ nodes and $E$ edges, a cut is defined as a partition of the graph into two complementary subsets of nodes. In the MaxCut problem we are looking for a cut where the number of edges between the two subsets is maximal. We can represent a cut of the graph by a binary vector $x$ of size $n$, where we assign 0 and 1 to nodes in the first and second subsets, respectively. The number of connecting edges for a given cut is simply given by summing over $x_i (1-x_j)+x_j (1-x_i)$ for every pair of connected nodes $(i,j)$.\n",
    "\n",
    "# Solving with the Classiq platform\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "311c3a03-cd25-4453-94ff-8743b0ba0e55",
   "metadata": {},
   "source": [
    "In this tutorial we define a **search problem** instead: Given a graph and number of edges, check if there is a cut in the grpah that We will solve the problem using the grover algorithm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e5e216e7-2bb6-4a8d-a63b-3585f3594c84",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:28:39.521094Z",
     "iopub.status.busy": "2024-05-07T14:28:39.520617Z",
     "iopub.status.idle": "2024-05-07T14:28:40.766013Z",
     "shell.execute_reply": "2024-05-07T14:28:40.765174Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx\n",
    "import numpy as np\n",
    "import pyomo.core as pyo\n",
    "from IPython.display import Markdown, display\n",
    "from sympy import simplify"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e32027b-edd3-47d2-bb68-233bbea58fc9",
   "metadata": {},
   "source": [
    "### Define the cut search problem"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3d3ac71a-edba-4459-8210-dad999fee2c5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:28:40.771752Z",
     "iopub.status.busy": "2024-05-07T14:28:40.770306Z",
     "iopub.status.idle": "2024-05-07T14:28:40.778729Z",
     "shell.execute_reply": "2024-05-07T14:28:40.778033Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def is_cross_cut_edge(x1: int, x2: int) -> int:\n",
    "    return x1 * (1 - x2) + x2 * (1 - x1)\n",
    "\n",
    "\n",
    "def generate_maxcut_formula(graph: nx.Graph, cut_size) -> pyo.ConcreteModel:\n",
    "    model = pyo.ConcreteModel()\n",
    "    model.x = pyo.Var(graph.nodes, domain=pyo.Binary)\n",
    "\n",
    "    model.cut_edges_constraint = pyo.Constraint(\n",
    "        expr=sum(\n",
    "            is_cross_cut_edge(model.x[node1], model.x[node2])\n",
    "            for (node1, node2) in graph.edges\n",
    "        )\n",
    "        >= cut_size\n",
    "    )\n",
    "\n",
    "    expr = str(model.cut_edges_constraint.expr)\n",
    "    for i in graph.nodes:\n",
    "        expr = expr.replace(f\"[{i}]\", f\"{i}\")\n",
    "    expr = str(simplify(expr))\n",
    "    return expr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39d882bc-56e8-4680-8803-14b1dd05d115",
   "metadata": {},
   "source": [
    "### Define a speific problem input"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "bf2306e8-25ee-47e8-8d15-a208342d84be",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:28:40.783444Z",
     "iopub.status.busy": "2024-05-07T14:28:40.782259Z",
     "iopub.status.idle": "2024-05-07T14:28:41.111420Z",
     "shell.execute_reply": "2024-05-07T14:28:41.110934Z"
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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92ihWbNmoiN7DaPRiClTpmD8+PHYtGkT7r77btGRPBqvEFxFbm4uEhMTMXDgQMyYMUN0HCJqYHJyctyjhd27d8Nut6NZs2bu0UK3bt2g0fD3umsxmUz46aefsGHDhgY3OuDIoBYoioLnn38ep06dQnJyMoKCgkRHIqIGrLy8HLt373aveVBQUACDwYB+/fphwIAB6N+/P294/hulpaVITExEmzZtsHjx4gY1OmAhqAVffPEFXn/9dSxevBj9+vUTHYeIyE2WZRw9etQ9Wjh8+DBUKhW6du3qHi20bNmyQZ34riUtLQ3jxo3D1KlTce+994qOU29YCGrowoULGD58OAYNGoSpU6eKjkNEdFX5+fnunRp37twJm82G2NhY92ihR48e3KkRwKxZs7B161YkJyejUaNGouPUCxaCGlAUBc8++yzOnDmD9evXIzAwUHQkIqJKq6iocO/UmJKSgtzcXOj1evTp0wfx8fHo379/g934x2KxIDExES1atMD777/fIK6gsBDUwL///W/MnTsX77//Pnr37i06DhFRtSmKghMnTrhHCwcOHAAAdOrUCQkJCRgwYADatm3bIE6Ml6Snp+O5557Da6+9hmHDhomOU+dYCKopOzsbw4cPx+23347XXntNdBwiolpVVFTk3qlxx44dsFqtiIqKco8WevXqBT8/P9Ex69ycOXPw3XffITk52edXiGQhqAZZlvH0008jOzsbycnJXGOciHyaw+Fw79SYkpKC8+fPw8/PD71793Zv5RwZGSk6Zp2wWq0YPnw4GjdujA8++MCnV4VkIaiG9evXY/78+fjwww9xww03iI5DRFRvFEVBZmame7Swb98+yLKMDh06uEcLHTp08KkT565du/DMM8/glVdeQWJioug4dYaFoIrOnTuHESNG4K677sKkSZNExyEiEspsNrtHC2lpaSgtLUV4eDgGDBiAhIQExMXFISAgQHTMGnvjjTfwzTffIDk5GY0bNxYdp06wEFSBLMt48sknkZubi3Xr1nFUQET0J06n071TY0pKCs6cOQOdTodevXq5Rwve+gif1WrFiBEjEBMTgyVLlvjUFZBLWAiqYO3atXjrrbewbNky9OzZU3QcIiKPlpWV5V5OOSMjAy6XC23atHEviNS5c2evOrHu2bMHTz75JF5++WWMGDFCdJxax0JQSVlZWRg5ciTuu+8+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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create graph\n",
    "G = nx.Graph()\n",
    "G.add_nodes_from([0, 1, 2, 3, 4])\n",
    "G.add_edges_from([(0, 1), (0, 2), (1, 2), (1, 3), (2, 4), (3, 4)])\n",
    "pos = nx.planar_layout(G)\n",
    "nx.draw_networkx(G, pos=pos, with_labels=True, alpha=0.8, node_size=500)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "074e98b5-83ed-4a5b-9ac1-1ef9859a869c",
   "metadata": {},
   "source": [
    "here we look for a cut of size 4 to the graph:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9f00c3c0-1830-40b9-affe-80abf7a41a6f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:28:41.114528Z",
     "iopub.status.busy": "2024-05-07T14:28:41.113906Z",
     "iopub.status.idle": "2024-05-07T14:28:41.573311Z",
     "shell.execute_reply": "2024-05-07T14:28:41.572572Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2*x0*x1 + 2*x0*x2 - 2*x0 + 2*x1*x2 + 2*x1*x3 - 3*x1 + 2*x2*x4 - 3*x2 + 2*x3*x4 - 2*x3 - 2*x4 <= -4\n"
     ]
    }
   ],
   "source": [
    "formula = generate_maxcut_formula(G, cut_size=4)\n",
    "print(formula)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87c640ad-f91c-4b2d-bdf9-28a329c8107a",
   "metadata": {},
   "source": [
    "## Creating quantum circuit from the problem formulation and solving it using the Classiq platform"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5e1d3413-4a44-4382-830b-f1f22a924a1b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:28:41.576134Z",
     "iopub.status.busy": "2024-05-07T14:28:41.575630Z",
     "iopub.status.idle": "2024-05-07T14:28:43.241454Z",
     "shell.execute_reply": "2024-05-07T14:28:43.240590Z"
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from classiq import RegisterUserInput, construct_grover_model\n",
    "\n",
    "register_size = RegisterUserInput(size=1)\n",
    "\n",
    "qmod = construct_grover_model(\n",
    "    num_reps=3,\n",
    "    expression=formula,\n",
    "    definitions=[(f\"x{i}\", RegisterUserInput(size=1)) for i in G.nodes],\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc9f2554-ea2d-4666-a2e5-2578c253e79d",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Synthesizing the Circuit\n",
    "\n",
    "We proceed by synthesizing the circuit using Classiq's synthesis engine. The synthesis should take approximately several seconds:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "542b41be-c61c-42cf-a6ea-062a9c8abc01",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:28:43.247179Z",
     "iopub.status.busy": "2024-05-07T14:28:43.245670Z",
     "iopub.status.idle": "2024-05-07T14:28:43.268222Z",
     "shell.execute_reply": "2024-05-07T14:28:43.267473Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from classiq import Constraints, QuantumProgram, set_constraints, synthesize\n",
    "\n",
    "qmod = set_constraints(qmod, Constraints(max_width=22))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e400ac31-f38f-4855-a00b-c3b599ce299c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:28:43.273281Z",
     "iopub.status.busy": "2024-05-07T14:28:43.272039Z",
     "iopub.status.idle": "2024-05-07T14:28:43.292797Z",
     "shell.execute_reply": "2024-05-07T14:28:43.292029Z"
    }
   },
   "outputs": [],
   "source": [
    "from classiq import write_qmod\n",
    "\n",
    "write_qmod(qmod, \"grover_max_cut\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6f5ea028-27b3-4653-9430-4120ff432998",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:28:43.297662Z",
     "iopub.status.busy": "2024-05-07T14:28:43.296497Z",
     "iopub.status.idle": "2024-05-07T14:29:25.417835Z",
     "shell.execute_reply": "2024-05-07T14:29:25.417131Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "qprog = synthesize(qmod)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce6b4557-33f6-48b9-9f15-e97a09c03614",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "tags": []
   },
   "source": [
    "## Showing the Resulting Circuit\n",
    "\n",
    "After Classiq's synthesis engine has finished the job, we can show the resulting circuit in the interactive GUI:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6a3c1723-4374-451a-8336-32bcf533b046",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:29:25.422525Z",
     "iopub.status.busy": "2024-05-07T14:29:25.421415Z",
     "iopub.status.idle": "2024-05-07T14:29:25.724164Z",
     "shell.execute_reply": "2024-05-07T14:29:25.723404Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Opening: https://platform.classiq.io/circuit/cc943f14-4419-40ac-b0bf-c25f2b76f943?version=0.41.0.dev39%2B79c8fd0855\n"
     ]
    }
   ],
   "source": [
    "from classiq import show\n",
    "\n",
    "show(qprog)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1476725c-6063-4027-aa86-2831f647eda3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:29:25.727647Z",
     "iopub.status.busy": "2024-05-07T14:29:25.727183Z",
     "iopub.status.idle": "2024-05-07T14:29:25.810784Z",
     "shell.execute_reply": "2024-05-07T14:29:25.810008Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2491\n"
     ]
    }
   ],
   "source": [
    "circuit = QuantumProgram.from_qprog(qprog)\n",
    "\n",
    "print(circuit.transpiled_circuit.depth)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fddd0a9b-fd4e-4d35-bc0a-aaf381305a9f",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### Execute the problem on a simulator and try to find a valid solution\n",
    "Lastly, we can execute the resulting circuit with Classiq's execute interface, using the `execute` function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6cb370d3-f302-4256-a086-4881adc16f83",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:29:25.815614Z",
     "iopub.status.busy": "2024-05-07T14:29:25.814287Z",
     "iopub.status.idle": "2024-05-07T14:30:08.255177Z",
     "shell.execute_reply": "2024-05-07T14:30:08.254546Z"
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from classiq import execute, set_quantum_program_execution_preferences\n",
    "from classiq.execution import (\n",
    "    ClassiqBackendPreferences,\n",
    "    ClassiqSimulatorBackendNames,\n",
    "    ExecutionPreferences,\n",
    ")\n",
    "\n",
    "backend_preferences = ExecutionPreferences(\n",
    "    backend_preferences=ClassiqBackendPreferences(\n",
    "        backend_name=ClassiqSimulatorBackendNames.SIMULATOR\n",
    "    )\n",
    ")\n",
    "\n",
    "qprog = set_quantum_program_execution_preferences(qprog, backend_preferences)\n",
    "optimization_result = execute(qprog).result()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9ccbd6e5-c1ce-4818-bebe-78294e0690fe",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:30:08.257971Z",
     "iopub.status.busy": "2024-05-07T14:30:08.257495Z",
     "iopub.status.idle": "2024-05-07T14:30:08.260588Z",
     "shell.execute_reply": "2024-05-07T14:30:08.259986Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "res = optimization_result[0].value"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ccd981e5-078a-4259-91e5-798b60f79077",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Printing out the result, we see that our execution of Grover's algorithm successfully found the satisfying assignments for the input formula:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "57289675-1091-4a4f-bafb-b3c42dc6fde7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:30:08.262999Z",
     "iopub.status.busy": "2024-05-07T14:30:08.262562Z",
     "iopub.status.idle": "2024-05-07T14:30:08.267915Z",
     "shell.execute_reply": "2024-05-07T14:30:08.267273Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'x0': 1.0, 'x1': 0.0, 'x2': 0.0, 'x3': 1.0, 'x4': 1.0}: 82,\n",
       " {'x0': 1.0, 'x1': 0.0, 'x2': 1.0, 'x3': 1.0, 'x4': 0.0}: 77,\n",
       " {'x0': 1.0, 'x1': 0.0, 'x2': 0.0, 'x3': 0.0, 'x4': 1.0}: 75,\n",
       " {'x0': 0.0, 'x1': 1.0, 'x2': 1.0, 'x3': 0.0, 'x4': 1.0}: 71,\n",
       " {'x0': 0.0, 'x1': 0.0, 'x2': 1.0, 'x3': 1.0, 'x4': 0.0}: 69,\n",
       " {'x0': 0.0, 'x1': 1.0, 'x2': 0.0, 'x3': 0.0, 'x4': 1.0}: 68,\n",
       " {'x0': 0.0, 'x1': 1.0, 'x2': 1.0, 'x3': 1.0, 'x4': 0.0}: 67,\n",
       " {'x0': 1.0, 'x1': 0.0, 'x2': 0.0, 'x3': 1.0, 'x4': 0.0}: 65,\n",
       " {'x0': 1.0, 'x1': 1.0, 'x2': 0.0, 'x3': 0.0, 'x4': 1.0}: 65,\n",
       " {'x0': 0.0, 'x1': 1.0, 'x2': 1.0, 'x3': 0.0, 'x4': 0.0}: 63,\n",
       " {'x0': 1.0, 'x1': 1.0, 'x2': 1.0, 'x3': 0.0, 'x4': 0.0}: 22,\n",
       " {'x0': 1.0, 'x1': 0.0, 'x2': 1.0, 'x3': 0.0, 'x4': 1.0}: 19,\n",
       " {'x0': 0.0, 'x1': 0.0, 'x2': 0.0, 'x3': 1.0, 'x4': 0.0}: 18,\n",
       " {'x0': 1.0, 'x1': 1.0, 'x2': 1.0, 'x3': 1.0, 'x4': 1.0}: 18,\n",
       " {'x0': 0.0, 'x1': 1.0, 'x2': 0.0, 'x3': 1.0, 'x4': 0.0}: 17,\n",
       " {'x0': 1.0, 'x1': 0.0, 'x2': 1.0, 'x3': 0.0, 'x4': 0.0}: 16,\n",
       " {'x0': 1.0, 'x1': 1.0, 'x2': 0.0, 'x3': 1.0, 'x4': 1.0}: 16,\n",
       " {'x0': 0.0, 'x1': 0.0, 'x2': 0.0, 'x3': 0.0, 'x4': 0.0}: 15,\n",
       " {'x0': 0.0, 'x1': 0.0, 'x2': 1.0, 'x3': 0.0, 'x4': 0.0}: 15,\n",
       " {'x0': 1.0, 'x1': 1.0, 'x2': 1.0, 'x3': 0.0, 'x4': 1.0}: 14,\n",
       " {'x0': 1.0, 'x1': 0.0, 'x2': 0.0, 'x3': 0.0, 'x4': 0.0}: 14,\n",
       " {'x0': 1.0, 'x1': 0.0, 'x2': 1.0, 'x3': 1.0, 'x4': 1.0}: 14,\n",
       " {'x0': 0.0, 'x1': 0.0, 'x2': 0.0, 'x3': 0.0, 'x4': 1.0}: 13,\n",
       " {'x0': 1.0, 'x1': 1.0, 'x2': 0.0, 'x3': 0.0, 'x4': 0.0}: 12,\n",
       " {'x0': 0.0, 'x1': 0.0, 'x2': 1.0, 'x3': 0.0, 'x4': 1.0}: 11,\n",
       " {'x0': 0.0, 'x1': 0.0, 'x2': 1.0, 'x3': 1.0, 'x4': 1.0}: 11,\n",
       " {'x0': 0.0, 'x1': 1.0, 'x2': 0.0, 'x3': 1.0, 'x4': 1.0}: 11,\n",
       " {'x0': 0.0, 'x1': 1.0, 'x2': 0.0, 'x3': 0.0, 'x4': 0.0}: 11,\n",
       " {'x0': 1.0, 'x1': 1.0, 'x2': 1.0, 'x3': 1.0, 'x4': 0.0}: 11,\n",
       " {'x0': 1.0, 'x1': 1.0, 'x2': 0.0, 'x3': 1.0, 'x4': 0.0}: 10,\n",
       " {'x0': 0.0, 'x1': 0.0, 'x2': 0.0, 'x3': 1.0, 'x4': 1.0}: 7,\n",
       " {'x0': 0.0, 'x1': 1.0, 'x2': 1.0, 'x3': 1.0, 'x4': 1.0}: 3]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.parsed_counts"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66b05fd2-25ef-403b-b40b-45a2358acf52",
   "metadata": {},
   "source": [
    "We can see that the satisfying assignments are ~6 times more probable than the unsatisfying assignments. Let's print one of them:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7d0d9948-c3fe-4d7b-85bb-2a1b1de7a953",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:30:08.270256Z",
     "iopub.status.busy": "2024-05-07T14:30:08.269898Z",
     "iopub.status.idle": "2024-05-07T14:30:08.274951Z",
     "shell.execute_reply": "2024-05-07T14:30:08.274330Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "state={'x0': 1.0, 'x1': 0.0, 'x2': 0.0, 'x3': 1.0, 'x4': 1.0} shots=82\n"
     ]
    }
   ],
   "source": [
    "most_probable_result = res.parsed_counts[0]\n",
    "print(most_probable_result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a3a3995d-b677-476b-8bae-7c56b8cb7c4d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:30:08.277207Z",
     "iopub.status.busy": "2024-05-07T14:30:08.276812Z",
     "iopub.status.idle": "2024-05-07T14:30:08.440104Z",
     "shell.execute_reply": "2024-05-07T14:30:08.439527Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgQAAAGFCAYAAACCBut2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABTxUlEQVR4nO3dd3hUZeL28e9Meg8BAoSOdKWKSMnE8rOsu667uhpBafauKKLYIBQVUbEhooKiolKsaxdfXcnQEQSRXoMkJKSQnkwmc94/jsQOSUhyZib357q4XJKZc+4skHPnPM95HpthGAYiIiLSqNmtDiAiIiLWUyEQERERFQIRERFRIRARERFUCERERAQVAhEREUGFQERERIDA6rzI4/GQnp5OVFQUNputvjOJiIhIHTAMg8LCQhISErDbj30PoFqFID09nbZt29ZJOBEREWlYBw4coE2bNsd8TbUKQVRUVNUBo6OjTzyZiIiI1LuCggLatm1bdR0/lmoVgqPDBNHR0SoEIiIiPqY6w/2aVCgiIiIqBCIiIqJCICIiIqgQiIiICCoEIiIiggqBiIiIoEIgIiIiqBCIiIgIKgQiIiKCCoGIiIigQiAiIiKoEIiIiAgqBCIiIkI1dzsUET9y6BBs2QJbt8KuXVBSYn48PBw6d4YePaBnT2jZ0tqcItKgVAhEGoOKCvjmG3j7bUhNhdJSMAzweODotqiGAXa7+fuwMHA4YPhwOOssCAqyNr+I1DsVAhF/t2wZTJoEO3dCZSVERkLz5hD4F//83W4oLobPP4elS6FLF5gyxSwIIuK3VAhE/FVBATz+OCxYAGVl0KwZhIQc/32BgRATY/4qL4dt22DUKBgxAsaPh+jo+s8uIg1OkwpF/FFWFowcCS+/DAEBkJBQvTLweyEh5nsDAsxjjRxpHltE/I4KgYi/yc2FMWNg9WqIj4fY2F/mCdSGzWYeo3lz85hjxpjnEBG/okIg4k88Hrj9dli/3iwDwcF1d+yQEPOY330Hd9xhnktE/IYKgYg/WbDAfJogLq5uy8BRwcHQtCl8/TW8+WbdH19ELKNCIOIv9u83JxHa7eaaAvUlPNw8x4wZ5jlFxC/oKQMRf/Hqq3D4sDkJ8Dj2lJfz4uHDbC0rI8ftJtRup1NICCPj4kiKijr+uZo3h/R0mD/ffKRRRHye7hCI+IP8fHj3XQgNNX96P46MigpKPB4ujInh7hYtuLZZMwDu+ukn3svLO/757HbzXO+8Yz7eKCI+T3cIRPzBJ59Adja0aFGtlw+NjGRoZORvPnZ5kyaM2LuXN3NzuaRJk+MfJDYWMjPh44/hiitqEVpEvInuEIj4g1WrzKWH/2r1wWqw22y0CAqisLKyem8IDDTPuXp1rc8pIt5DdwhE/MH69bV6qqDU46Hc46HI42FZURHLi4o4ryYrEQYHm+cWEZ+nQiDi67KzzR0Mw8Jq/NanMjN578gRwLxdeFZUFPfUZJfD0FDIyDAz/DwPQUR8kwqBiK/LzjZ3M6zF0sRXxMVxTnQ0WW43XxUU4AHchlH9AwQFmRsh5eSoEIj4OM0hEPF1FRXmf2uxPHGHkBA6lJTQ/fBhpsXFUeLxMPbAAYzqlgKbzZxHcDSDiPgsFQIRX3d07kBNfrL/WbnLRW5uLq6KCjLS0zkrMpItZWWkuVzVO4BhmKWgPlZFFJEGpUIg4uuaNzdv3dfwp3QDyMzMpGOHDgQHB1PhdpP18xoERdXdp6Ciwjy3hgtEfJ4KgYivi4uD1q2hrKzab8l1u8nNySE6KoqQkBASWrXCbRh8VlhIoMdDx+rORygrM88dF1fL8CLiLTSpUMQf9OsH27dX++VTf/qJ7JISEps3p8WRI+S43bwP7DMMxthshFR3+MHlgv79a5dZRLyKCoGIPxgyBBYv/uUW/jEYwKluN87wcN7NyyO/spKIgAC6RURwRUAAfT0eMjMzSTjenggVFeb8gUGD6u7rEBHL2IxqTCcuKCggJiaG/Px8omuyaImINIyiIkhMhLw8c07BMWTn5BAYGEhsTMwfPldSWsr+ffswgLZt2xL1u+WNf+PwYXOoIDUVjvU6EbFMTa7fmkMg4g8iIyE5GcrL4RgTAsvLyykrLSXmT8oAQHhYGHFNmwKQkZFB5V8tY+zxmOe67DKVARE/oUIg4i/GjIGWLSEr608/bRgGhzIzadGyJcdasaB58+aEBAfjdrs5lJn55y/KyoJWrcxziohfUCEQ8RcJCXD//eb/Li7+w6dzcnKIjYkh6DgbINltNhISErAB+fn5FBYW/vYFR499333mOUXEL6gQiPiTSy+Fv/3NnEtQXl714bLycsrKy4n+i6GC3wsLC6Ppr4YO3EeHDsrLzWNfcIF5LhHxGyoEIv7EboeZM2HwYHPSX1kZhmGQmZlJyxYtjjlU8HvNmjcnJCQEd2Ulhw4dMtccOHzYfKLhySfNc4mI39C/aBF/Ex0Nr7wCZ5wBOTkUpqURGxND4HGGCn6vaujAMCA3l/L0dPOY8+aZ5xARv6JCIOKPmjSBV1/l8IgRVLjdRBcVQWlpzfY7MAzCDIN2gYEYwOtNm5I3c6Z5bBHxOyoEIn6qIiiIScXFBL77Lrb+/aGwEA4e/GV+wZ+VA8P4ZZ7AwYNQWEjY0KE8f8YZvBgTw2PPPdfwX4iINAitVCjip1555RUuvvhiYs4+G848E1atgoUL4Ysv4MgRcLvNFx4tBke3Tw4MhPBwc12DYcOwDxrEmB07+Gb0aL766iuWLl3Kueeea8WXJCL1SIVAxA9t27aNtLQ0brjhBvMDdrs5GXDIECgogG3bYOtW2L3bHEoACAuDk06CHj2ge/ffzBPo3r07V199NS+//DLTp0/n1FNPJU4bGon4FS1dLOJnXC4Xd9xxB4888ghN6nC8v6KigtGjR7Njxw7OOussZsyYgc1Wk+cWRKShaelikUZs7ty5XHbZZXVaBgCCgoJISUkhICCAb775hi+//LJOjy8i1lIhEPEjW7Zs4dChQ5x99tn1cvyuXbty3XXXAfDYY4+RnZ1dL+cRkYanQiDiJ1wuF8899xzjxo2r1/OMGTOG7t27U1BQwCOPPEI1Rh1FxAeoEIj4iRdffJFhw4b95U6GdSUwMJCUlBQCAwNZtmwZn332Wb2eT0QahgqBiB/44YcfyMnJ4YwzzmiQ83Xu3Jnrr78egMcff5zDhw83yHlFpP6oEIj4uPLycp5//nnuuuuuBj3v6NGj6dmzJ4WFhTz88MMaOhDxcSoEIj5uzpw5XHHFFQ3+SHBAQAApKSkEBQXhdDr5+OOPG/T8IlK3VAhEfNimTZvIz88nKSnJkvN36tSJG2+8EYAnnniCrKwsS3KIyIlTIRDxUWVlZcyePZs777zT0hwjRozglFNOobi4mGnTpmnoQMRHqRCI+KjZs2czatQooqKiLM1xdOggODiYFStW8N///tfSPCJSOyoEIj5ow4YNlJSUMGTIEKujANChQwduvvlmAJ588kkOHTpkcSIRqSkVAhEfU1payosvvsjYsWOtjvIbV1xxBb1796akpIQpU6Zo6EDEx6gQiPiYWbNmMWbMGCIjI62O8ht2u71q6GDNmjW8//77VkcSkRpQIRDxId999x0VFRUMGjTI6ih/ql27dtx6660APP3006Snp1ucSESqS4VAxEeUlJTw0ksvcccdd1gd5ZiGDRtGv379KCkpYerUqXg8HqsjiUg1qBCI+IhZs2ZxzTXXEBERYXWUY7Lb7UycOJHQ0FDWrl3Lu+++a3UkEakGFQIRH7BmzRoMw2DgwIFWR6mWtm3bcttttwHwzDPPcPDgQYsTicjxqBCIeLni4mLmzZtXdYH1FZdddhn9+/enrKyMyZMna+hAxMupEIh4uWeffZbrr7+e8PBwq6PUiN1uZ9KkSYSFhbF+/XqWLFlidSQROQYVAhEvtmrVKgIDAzn11FOtjlIrrVu3rpoE+eyzz3LgwAGLE4nIX1EhEPFSRUVFzJ8/v+oxPl91ySWXMHDgQMrLy0lJSdHQgYiXUiEQ8VLPPPMMN9xwA2FhYVZHOSF2u52HHnqI8PBwNm7cyMKFC62OJCJ/QoVAxAutWLGCsLAw+vXrZ3WUOtGqVauqpZZnzZpFWlqatYFE5A9UCES8TGFhIa+//nrVZkH+4uKLL+b000/H5XJp6EDEC6kQiHiZp556iptuuonQ0FCro9Qpm83GxIkTiYiIYNOmTbz55ptWRxKRX1EhEPEiqampREdH06dPH6uj1IsWLVpw1113AfDCCy+wd+9eixOJyFEqBCJeoqCggDfffJObbrrJ6ij16qKLLmLIkCFVQweVlZVWRxIRVAhEvMbMmTO55ZZbCAkJsTpKvbLZbDz44INERkby448/smDBAqsjiQgqBCJe4dtvvyUuLo5evXpZHaVBxMfHc/fddwMwZ84c9uzZY3EiEVEhELFYfn4+Cxcu5MYbb7Q6SoP6xz/+QWJiIhUVFUyaNAm32211JJFGTYVAxGJPPvkkt912G8HBwVZHaVA2m40HHniAqKgotm7dyuuvv251JJFGTYVAxEJff/01LVu2pGfPnlZHsUTz5s0ZP348AC+99BK7du2yOJFI46VCIGKRvLw83nnnHa699lqro1jqggsu4IwzzsDtdmvoQMRCKgQiFmmsQwW/Z7PZuP/++4mOjmb79u28+uqrVkcSaZRUCEQssHTpUtq0aUOPHj2sjuIVmjZtyr333gvA3Llz2bFjh8WJRBofFQKRBpabm8v777/PNddcY3UUr3Leeedx9tlnU1lZSUpKChUVFVZHEmlUVAhEGpBhGDzxxBOMHTuWoKAgq+N4FZvNxoQJE4iNjWXHjh288sorVkcSaVRUCEQa0NKlS+nQoQNdu3a1OopXiouLY8KECQDMmzePbdu2WZxIpPFQIRBpIDk5OXzwwQdcffXVVkfxaueccw7nnHMOHo+HSZMm4XK5rI4k0iioEIg0AMMwePzxx7nzzjsJDAy0Oo7Xu/fee2nSpAm7d+9m7ty5VscRaRRUCEQawGeffUbXrl3p0qWL1VF8QpMmTbjvvvsAmD9/Plu2bLE4kYj/UyEQqWeHDx/m008/ZfTo0VZH8Slnn302559/Ph6Ph5SUFA0diNQzFQKRenR0qOCuu+4iICDA6jg+55577iEuLo49e/bw4osvWh1HxK+pEIjUo08++YSePXvSqVMnq6P4pJiYGB544AEA3njjDX744QeLE4n4LxUCkXqSlZXF559/zsiRI62O4tPOOOMM/v73v+PxeJg8eTLl5eVWRxLxSyoEIvXg6FDBuHHjNFRQB+6++26aNWvGvn37mDNnjtVxRPySCoFIPfjoo4/o1asXHTt2tDqKX4iOjq4aOliwYAGbNm2yOJGI/1EhEKljhw4dYunSpYwYMcLqKH7F4XBw4YUXYhgGKSkplJWVWR1JxK+oEIjUoaNDBXfffTd2u/551bVx48bRvHlz0tLSmD17ttVxRPyKvmOJ1KH333+fU089lfbt21sdxS9FRUXx0EMPAfD222+zYcMGixOJ+A8VApE6kpGRwf/+9z+GDRtmdRS/NmTIEP71r39hGAaTJ0+mtLTU6kgifkGFQKQOeDweHn/8ccaPH6+hggZw55130qJFC3766SdmzZpldRwRv6DvXCJ14L333mPgwIG0bdvW6iiNQmRkZNXQwaJFi/juu+8sTiTi+1QIRE7QwYMHcTqdJCcnWx2lURk0aBCXXHIJAJMnT6akpMTiRCK+TYVA5ARoqMBaY8eOpVWrVqSnp/Pcc89ZHUfEp+k7mMgJeOeddxgyZAitW7e2OkqjFB4eXjV0sGTJEtasWWNxIhHfpUIgUksHDhxg5cqVXHrppVZHadQGDhxY9WcwdepUDR2I1JIKgUgtaKjAu9x+++0kJCSQkZHB008/bXUcEZ+k72QitbBw4ULOPPNMEhISrI4imEMHkyZNAswnPlatWmVxIhHfo0IgUkNpaWmsW7eOiy++2Ooo8iunnnoql19+OWAOHRQVFVmcSMS3qBCI1IDH4+GJJ57gnnvuwWazWR1HfufWW2+lTZs2ZGZm8tRTT1kdR8SnqBCI1MBbb73F2WefTcuWLa2OIn8iLCyMSZMmYbPZ+PDDD1mxYoXVkUR8hgqBSDXt27eP77//nn/9619WR5Fj6NevH8OHDwdg2rRpFBYWWpxIxDeoEIhUg8fj4cknn9RQgY+4+eabadeuHVlZWcycOdPqOCI+QYVApBoWLFjAueeeS3x8vNVRpBpCQ0NJSUnBZrPx0UcfkZqaanUkEa+nQiByHHv27GHz5s3885//tDqK1EDv3r258sorAXj44YcpKCiwOJGId1MhEDmGyspKnnzySe6++24NFfigm266ifbt25Odnc0TTzxhdRwRr6ZCIHIMr732Gv/4xz80VOCjQkJCSElJwW638+mnn/Ltt99aHUnEawVaHUCkXuXkwKpVsGULbNoE+/dDWRkEBkLTptC3L/To8ct/f3UXYNeuXezYsYOrrrrKsvhy4nr16sXIkSN57bXXePjhh+nbty8xMTFWxxLxOjbDMIzjvaigoICYmBjy8/OJjo5uiFwitWcYsGEDLFkCH3wAR46YF3rDgODgXy76bjdUVpofDwuDAQPgyivhb3/DHRjI7bffzpQpU2jWrJmVX43UAZfLxYgRI9izZw/nn38+Dz/8sNWRRBpETa7fKgTiX7KzYepU+PBD805AeDjExEBAwF+/xzCguBiOTjrr0YMPBw4k5Iwz+Nvf/tYwuaXebdmyhTFjxuDxeJgxYwZnn3221ZFE6l1Nrt+aQyD+48sv4e9/h0WLzDsBrVtDXNyxywCYdwwiIyEhAZo1w71pE44XXuD8tWvNUiF+oWfPnowZMwaARx99lLy8PGsDiXgZFQLxD2+8ATfeCD/9BK1aQXT0b+YDVJcnKIiDQExsLLbZs+Gmm8y7B+IXrr32Wk466STy8vKYMWOG1XFEvIoKgfi+t9+GiRPNOQGtWh3/jsAx5GRnE9ukCQHNmkGTJvDZZ3DbbVBeXoeBxSrBwcFMnjwZu93O0qVLWbp0qdWRRLyGCoH4tg0bfikDzZvX6q7AUaVlZbhcrl/G2cLDzSGHzz+HJ5+so8Bite7du3P11VcD8Nhjj5Gbm2txIhHvoEIgvqu0FO67DwoLIT7+hMqAxzDIysqiRcuW/OYo4eHmEwjz5sGaNSccWbzDNddcQ5cuXThy5AjTp0+nGnOrRfyeCoH4rjlzYOPGEy4DANnZ2TRp0oTAPxtuiI2FkhJ44AENHfiJoKAgJk+eTEBAAF9//bWGDkRQIRBfVVgI8+ebTxMEB9f47a9kZzNg61aS9+yhtKyMiooKoqOi/vzFNhs0awY//gi6cPiNrl27cu211wIwffp0cnJyLE4kYi0VAvFNn3wChw+bE/9qKKuigleyswmz2zGODhW0aHHsN4WEmOsVvPVWLQOLN7rqqqvo1q0bBQUFPPLIIxo6kEZNhUB808KF5n8Da7769tNZWfQKC6NHaCiu8vK/Hir4vehocxnkHTtqfE7xToGBgaSkpBAYGMi3337LZ599ZnUkEcuoEIjvKSw09yaIiKjxW9eXlPBVQQHjWrTA7XbjMYy/Hir4vYgIcyLjxo01Pq94ry5dunD99dcD8MQTT3D48GGLE4lYQ4VAfM+2beaFOTS0Rm/zGAaPHzrEv2Nj6RQSQllZGaE1OYb9538uW7fW6Lzi/UaPHk2PHj00dCCNmgqB+J7t2811B2o4mfCdvDwyKiq4qXlzDh8+TEhICLaaPp1gt+sOgR8KCAhg8uTJBAUFkZqayieffGJ1JJEGp0IgvqegwLww1+Binl9ZyZzsbK6OiyPY5aKyspKgoKCanzsgALQGvl/q1KkTN9xwA2AOHWRlZVmcSKRhqRCI73G7a/yW2VlZxAQEMLS0lPT0dGJjY2t3bputVucX3zBy5EhOPvlkioqKmDZtmoYOpFFRIRDfExxsPgJYTWkuF+8fOcI/Q0I4UFhIustFpseDyzBwGwbpLhcFlZXVO5hhmI8gil8KCAggJSWF4OBgVqxYwUcffWR1JJEGo0Igvqd1a/PCXM2L+OGKCioNg5mHD3Ory8UdlZVclpbG5tJS0lwuLtq9m5ezs6t3bpcLOnU6gfDi7Tp27MhNN90EwJNPPsmhQ4csTiTSMGr+ELeI1Xr0MJ8wKC839xo4jk4hIYwPDqbM4yE0JKRqv4LZhw9T4vFwd4sWtKnufAK7HU455cTyi9e78sor+eabb9i0aRNTp05l1qxZNZ+AKuJjdIdAfE/HjuYiQaWl1Xt9URG9Kyo4PTCQi9u356yoKM6MiiI2IIBwu50zo6LoXJ3HDysqzDkEPXqcWH7xena7nUmTJhEcHMzq1av54IMPrI4kUu9UCMT3BATAeeeZheA4cwlcFRVkZmYCEB8fT0gt9j2okp9vboc8cGDtjyE+o3379tx6660APPXUU2RkZFicSKR+qRCIb0pONif3HeMugQFkZGTg8XgIDw8nLi7uN59/qX17Fld3PoBhQFkZXHqpeXdCGoVhw4bRt29fSkpKmDJlCh6Px+pIIvVGhUB804AB0Lu3uSbAX9wlyMvLo7i4GLvNRkKrVpzQCHB+vrl0cXLyiRxFfMzRoYOQkBDWrl3Le++9Z3UkkXqjQiC+yWaDCRMgLMy8WP+Oq6KiamGZ+BYtCD6RoQK3G4qKYNgwzR9ohNq2bcttt90GwDPPPEN6errFiUTqhwqB+K6hQ2HUKPNi7XJVfdgA0tPTq4YKmtRii+RfDmZAVhZ06QL33HPimcUnJScn079/f0pLS5k8ebKGDsQvqRCIbxs3zhw6yMqqWkEwLy+PkpIS7HY7CQkJtR8qOFoGIiLgkUcgJqbOYotvOTp0EBYWxnfffcc777xjdSSROqdCIL4tKgpeeQW6dYNDh3AVF5P1q6cKgmuzXwGYZSAz01wV8bHHwOGow9Dii1q3bs3tt98OwLPPPsuBAwcsTiRSt1QIxPe1aQNvvonRuzel+/cTUVFBxIkMFZSVwcGDEBkJTz0Fl1xSt3nFZ/3nP/9hwIABlJWV6akD8TsqBOIf2rRhybBhvB0bS4DNRhubDVtxcY32PMDlMu8K5ObC4MHw3ntw0UX1l1l8jt1uZ+LEiYSHh7NhwwYWLVpkdSSROqNCIH4hLS2Np+fOZW5CAjsmTiRg6FBzjYKDByE725x4+Pu9Dzwe8zV5eb+8rlUrmDQJFi2Cnj2t+WLEqyUkJDB27FgAZs2aRVpamrWBROqI9jIQn+fxeEhJScHlcjFw4EDOuO8+8xMbN5oX9i++gCNHoKDAvGNwdE16j8dc3Cg8HE4/3Xys8LzzzH0SRI7h4osv5quvvmLNmjWkpKQwd+5c7Hb9fCW+zWZUY8PvgoICYmJiyM/PJ1qrtImXeeONN3jmmWcIDw9n8eLFtGzZ8rcv8Hjgp59g61ZITzc3RQoMNJ8a6N4dunbVlsZSY4cOHSI5OZmSkhLGjh3LiBEjrI4k8gc1uX7rDoH4tH379vHCCy8AMG7cuD+WATB3KGzXzvwlUkdatmzJXXfdxbRp05g9ezaJiYl06NDB6lgitaZ7XOKzKisrmTRpEi6XiyFDhnCRJgBKA/vXv/7F4MGDcblcpKSk6KkD8WkqBOKzFixYwI8//khkZCQPPvig9quXBmez2XjooYeIjIxk8+bNLFiwwOpIIrWmQiA+ac+ePcyZMwcwhwri4+MtTiSNVXx8POPGjQPghRdeYM+ePRYnEqkdFQLxOZWVlaSkpFBRUUFiYiIXXnih1ZGkkbvwwgtJTEykoqKClJQUKn//iKuID1AhEJ/z2muvsWXLFqKionjggQc0VCCWs9ls3H///URFRbFlyxZef/11qyOJ1JgKgfiUXbt28dJLLwEwfvx4mjdvbnEiEVN8fDzjx48H4MUXX2TXrl0WJxKpGRUC8Rlut5tJkybhdrtJSkriggsusDqSyG9ccMEFJCUl4Xa7SUlJwf3zDpwivkCFQHzGq6++yvbt24mOjtZQgXilo0MH0dHRbNu2jfnz51sdSaTaVAjEJ+zYsYO5c+cCcO+999K0aVOLE4n8uWbNmnHPPfcA8PLLL7Njxw6LE4lUjwqBeL1fz9w+++yzOe+886yOJHJM559/PmedddZvnogR8XYqBOL1XnnlFXbs2EFMTAwTJkzQUIF4PZvNxn333UdMTAw7duzg1VdftTqSyHGpEIhX27ZtG/PmzQNgwoQJxMXFWZxIpHri4uKYMGECAPPmzWPbtm0WJxI5NhUC8Voul4tJkybh8Xg455xzOPfcc62OJFIj5557Lv/3f/+noQPxCSoE4rXmzp3L7t27adKkCffee6/VcURqZcKECTRp0oRdu3ZVTYwV8UYqBOKVtmzZUvXI1n333UeTJk2sDSRSS02aNOG+++4DzEdnt2zZYnEikT+nQiBe59dbyZ533nmcffbZVkcSOSFHn47xeDykpKTgcrmsjiTyByoE4nVefPFF9uzZQ1xcnIYKxG/cc889xMXFsWfPnqrlt0W8iQqBeJXNmzfzxhtvAPDAAw8QExNjcSKRuhEbG1s1dPD666+zefNmixOJ/JYKgXiN8vLyqqGCCy64gDPOOMPqSCJ16qyzzuKCCy7Q0IF4JRUC8Rpz5sxh3759NG3atGrXOBF/M378eJo2bcq+ffuYM2eO1XFEqqgQiFfYtGkTCxYsAMyhgujoaIsTidSPo5tzAbzxxhts2rTJ4kQiJhUCsVxZWRkpKSkYhsGFF15IUlKS1ZFE6lVSUhL/+Mc/MAyDlJQUysvLrY4kokIg1ps9ezZpaWk0b96ccePGWR1HpEGMGzeO5s2bk5aWxuzZs62OI6JCINbasGEDb7/9NgAPPfQQUVFRFicSaRjR0dE8+OCDALz11lt8//331gaSRk+FQCxTWlrK5MmTMQyDiy66iCFDhlgdSaRBDR06lIsuugjDMJg8eTKlpaVWR5JGTIVALDNr1ix++ukn4uPjueuuu6yOI2KJu+66i/j4eA4cOMDzzz9vdRxpxFQIxBLr169n0aJFAEycOJHIyEiLE4lYIzIykoceegiAhQsXsn79eosTSWOlQiANrqSkhJSUFAAuvvhiBg0aZG0gEYsNHjyYiy++GIDJkydTUlJicSJpjFQIpME999xzpKen07JlS8aOHWt1HBGvMHbsWFq2bMnBgweZNWuW1XGkEVIhkAa1Zs0alixZAphDBRERERYnEvEOERERTJw4EYDFixezdu1aixNJY6NCIA2mpKSEqVOnAnDppZcycOBAixOJeJeBAwfyn//8B4ApU6Zo6EAalAqBNJinn36ajIwMEhISuP32262OI+KV7rjjDhISEsjIyOCZZ56xOo40IioE0iBWrVrFe++9B8CkSZMIDw+3OJGIdwoPD68aOnj33XdZvXq1xYmksVAhkHpXVFRUNVSQnJzMqaeeanEiEe82YMAAkpOTAXPooLi42OJE0hioEEi9e+qpp8jMzKR169bcdtttVscR8Qm33XYbrVu3JjMzk6eeesrqONIIqBBIvVqxYgUffvghNpuNlJQUwsLCrI4k4hPCwsKYNGkSAB988AErV660OJH4OxUCqTeFhYVMmzYNgGHDhtGvXz+LE4n4lv79+zN8+HAApk6dSmFhocWJxJ+pEEi9mTlzJllZWbRt25ZbbrnF6jgiPumWW26hbdu2ZGVlaehA6pUKgdSL1NRUPvroo6qhgtDQUKsjifik0NBQUlJSsNls/Pe//8XpdFodSfyUCoHUuYKCAh5++GEArrzySvr06WNxIhHf1qdPH6644goApk2bRkFBgcWJxB+pEEide+KJJ8jOzqZ9+/bcdNNNVscR8Qs333wz7dq1Izs7myeffNLqOOKHVAikTn377bd8+umn2O12UlJSCAkJsTqSiF8ICQlh8uTJ2O12PvnkE5YtW2Z1JPEzKgRSZ/Lz86uGCkaMGEGvXr0sTiTiX3r16sWIESMAePjhh8nPz7c4kfgTFQKpMzNmzCA3N5eOHTty4403Wh1HxC/deOONdOzYkZycHB5//HGr44gfUSGQOvH111/zxRdfYLfbmTx5MsHBwVZHEvFLwcHBpKSkYLfb+fzzz/nmm2+sjiR+QoVATlheXh6PPvooAKNHj6Znz54WJxLxbyeffDKjR48G4NFHH+XIkSPWBhK/oEIgJ2zGjBnk5eXRqVMnrrvuOqvjiDQK1113HZ06dSI3N5cZM2ZYHUf8gAqBnJClS5eydOlSDRWINLDg4OCqpw6+/PJLvvrqK6sjiY9TIZBay83N5bHHHgPg6quvpkePHhYnEmlcevTowVVXXQXA9OnTyc3NtTiR+DIVAqkVwzCYPn06R44coUuXLlxzzTVWRxJplK699lq6dOnCkSNHmD59OoZhWB1JfJQKgdTK0qVL+frrrwkICCAlJYWgoCCrI4k0SkFBQaSkpBAQEMDXX3/N0qVLrY4kPkqFQGosJyeH6dOnA3DNNdfQrVs3ixOJNG7dunWruks3ffp0cnJyLE4kvkiFQGrEMAweeeQRCgoK6Nq1K1dffbXVkUQEcx5P165dKSgo4NFHH9XQgdSYCoHUyGeffca3335LYGAgkydPJjAw0OpIIgIEBgaSkpJCYGAg//vf//jiiy+sjiQ+RoVAqu3w4cM88cQTgPkMdJcuXSxOJCK/1rVr16q1QGbMmEF2drbFicSXqBBItfx6qKBHjx5Vq6SJiHcZPXo0PXr0oKCggEceeURDB1JtKgRSLZ988gmpqalVM5o1VCDinY4OHQQFBbFs2TI+/fRTqyOJj1AhkOPKysqqGiq44YYbOOmkkyxOJCLHctJJJ3H99dcD8Pjjj5OVlWVxIvEFKgRyTIZhMG3aNIqKijj55JMZOXKk1ZFEpBpGjRpFz549KSoq4uGHH9bQgRyXCoEc00cffcSKFSsIDg5m0qRJBAQEWB1JRKrh6KJhwcHBLF++nI8++sjqSOLlVAjkLx06dIgnn3wSgBtvvJFOnTpZnEhEaqJTp07ceOONADz55JNkZmZanEi8mQqB/CnDMJg6dSrFxcX06tWLESNGWB1JRGphxIgR9OrVi+LiYqZNm6ahA/lLKgTyp95//31Wr15NcHAwKSkp2O36qyLii+x2e9XQwcqVK/nwww+tjiReSt/l5Q8yMjJ4+umnAbjlllto3769tYFE5IS0b9+eW265BYCZM2eSkZFhcSLxRioE8hsej4cpU6ZQUlJCnz59GD58uNWRRKQODB8+nD59+lBSUsLUqVM1dCB/oEIgv/Hee++xdu1aQkJCmDRpkoYKRPyE3W5n0qRJhISEsGbNGt577z2rI4mX0Xd7qZKens4zzzwDwG233Ua7du0sTiQidaldu3bceuutADz99NOkp6dbnEi8iQqBH6t0QWkuFGdB2REwPH/9Wo/Hw+TJkyktLaV///4kJyc3WE4RaTiXX345/fr1o7S0lClTpuDxHOMbgzQqWpDej7jLYM9XkLEeDn0P2VuhsgIwABuEREGLPtCiN7QdCq1PA9vPlfCdd97hu+++IzQ0lIkTJ2qoQMRPHR06GDZsGOvWreOdd97RDwACgM2oxsySgoICYmJiyM/PJzo6uiFySQ0UpsPmheavwoM/3wmwQ2Ao2APBZgPDMO8YVJaZ77EHQ/wp0PtKiDztJ0ZeNYyysjLuuecefXMQaQQWL17MjBkzCA0NZeHChbRp08bqSFIPanL91h0CH2Z44Mcl4HwUig5BQDCENTX/e8z3GeAuhUMb4NAGg8P2I4REt+eUpCguvfTShgkvIpa69NJL+X//7//x3XffMWXKFObMmaM7g42c/vR9VGku/Pda+HIclGRDVAJExB+/DIB5xyAo3HyPK/AItsyWDNg7g3+3eAyb/kqINApHhw7CwsJYv349ixcvtjqSWEzf/X1QcRa8PxJ2fgrBURDZ8pe5ADXhcpVzODeTsqAsYqJj+PHlGL6aAJ7Kus8sIt4nISGBsWPHAvDcc8+RlpZmbSCxlAqBjyk7Ah9eDenfmXcEgiNqeySD9PQMDMNDRGQEzdpGEBwFmxbA/1LMYQUR8X+XXHIJAwcOpLy8nMmTJ+upg0ZMhcCHGAYsmwbp66o/PPBXcnNzKS0twW6306pVK8BGSBQER8LG+bDtgzoKLSJezWaz8dBDDxEeHs7GjRt5++23rY4kFlEh8CF7lsKWJRASfWJlwOUqJysrC4AWLVoQFPTLwUKizcmKy6aaExVFxP+1atWKO++8E4Dnn3+e/fv3W5xIrKBC4CMqSsxb+ZUV5kW79gzS09MxDIOIiEhiY2P/8IrwePNRRuf0EzmPiPiSf//73wwaNAiXy0VKSoqGDhohFQIfsfMzOLIPwpsf/7XppVv44tAMXtqTzIxtiTy38x+899MEcl1p5OTkUFpait1uJ+HnoYLfsweYQwc7P4GCn+r8SxERL3R06CAiIoIffviBBQsWWB1JGpgKgQ8wDHOyH0BA0PFfvzJnPtsK/x/tw0/jvJZ306/JJaSVrOfl3cPZmfkdAC1atCQw6K8PFhIN5YWw5d26+ApExBe0aNGCcePGATBnzhz27NljcSJpSCoEPiBnu7kUcXWHCk6PG8GtnT/m/Jbj6Rv7bxKbXcOoDi9T7irjx4r3iYyMJDY25pjHsNnBHgRbFuuJA5HG5J///CdDhgypGjqorNRzyI2FCoEPyPzB3KcgKLx6r28T3psA229/+vcURBBlJFBAetVTBccTHGFOLCzUhmgijYbNZuPBBx8kMjKSLVu28MYbb1gdSRqICoEPyN5qXr5rs/gQQHl5GYcPZ1Fm5BMX0YLAwGqMO2DuhVBRap5fRBqP+Ph4xo8fD8CLL77I7t27LU4kDUGFwAcc/pHq/ED/pwzDfKpgb+Uyyu1H6Nvswmq/1x4IGJCzs3bnFhHf9fe//52kpCQqKipISUnB7XZbHUnqmQqBDyjLN2f+10ZeXi6Zxbv5zj2P9lH96RXzz5odwGY+8igijYvNZuP+++8nOjqarVu38tprr1kdSeqZCoEfKy8rY/+hHXzrfpRgWwSO4HEUFxXhqcFmBTbbz9spi0ij06xZs6qhg5dffpmdO3W70J+pEPiAoPCaX5QNw8O+9J1845qGx17O1d3n0aFFd9zuStLTM/jppwPk5eVSUeE6znHMuQQi0jj97W9/48wzz8TtdjNp0iQNHfgxFQIf0LRbzQtB5uEMviyYTCGHuKLjczQPOYnAoCCaNGlCmzZtaN26NUFBQeRk55CWlkZWVialpSXAL88YeirNQhDboU6/HBHxIUeHDmJiYtixYwevvPKK1ZGknqgQ+IDmPczLdHXXAygpLebDjAc4bOzg360eoX1U/z+8xmazExkZRctWrWjXri3R0dEUFxdz4MAB0tMPUlBQQEVpJYGh5vlFpPGKi4vj3nvvBWDevHls377d4kRSH1QIfEDznuYKhe6y47/WMDz8d+80fvKso0Po6dhD3fyQ/+lvfv2RjdDQMJo1a07btu2Ij4/H4/GQnZFPbtFBPl35lvZJF2nkzj33XM4++2wqKytJSUmhoqLC6khSxwKtDiDH17Kveds+bzcEhR37tdnZ2Rx27cIGZBjr+W/6hj+8plfM3495jMDAIGJiYrEXQZ+rK4k4qQMLFy5k//79dO7cmaSkJPr06UNgoP76iDQWNpuNCRMmsH79enbu3Mm8efO48cYbrY4ldchmGMe/EV1QUEBMTAz5+flER5/QVntSS9+9BN9MgsiWf/0IYllZKXv37gMMWrduc0J/Vq4icJfD8P9Ci17mxwzDYPfu3aSmpvL9998TGRnJ0KFDGTp0KDExx14KWUT8w1dffcWECROw2+289tpr9OihMUVvVpPrtwqBjyjOgtfOMjccioj/4+cNw8PevXspLy8nOjqa1q3b1PpchgGFB6HDGfCfheajh38mLy+PFStWsHz5coqLi+nfvz8Oh4OOHTti+6s3iYjPu++++1i6dCmdOnViwYIFBAcHWx1J/oIKgZ9aPw++eQhCm/xx6CArK4ucnGwCAwLpdFInAgJqfzu/JBsCgiH53V/uDhxPRUUFGzZswOl0snv3bjp06EBSUhL9+vXTNwsRP3PkyBGSk5PJzc3lqquu4pZbbrE6kvwFFQI/5XHDu1fC/m8hstUvQwelpaXs27cPMGjTpg1RUbX/M3KXQWkOJN4Hp99eu2MYhsH+/ftJTU1l/fr1hIaGMnjwYBITE4mLi6t1NhHxHt988w3jx4/Hbrczf/58evbsaXUk+RMqBH4sbw8suRwKDkBUAmDzsGfPXlyucqKjY2jdunWtj+0uh5LD0OEs+Pd8CAypm8wFBQWsXLmS5cuXc+TIEfr06YPD4aBLly4aWhDxYQ8++CCff/45HTt25M0339TdQC+kQuDnDm2ED68ytyUuDcgi90g2gYGBdOpU+6GCihIozYU2g80yEFpPcwQrKyvZuHEjTqeTHTt20Lp1a5KSkhgwYAAhIXXUQESkQeTn55OcnExOTg6jRo3i9ttreVtR6o0KQSNweAssGlnEwU3luAOKadm+CVFRUTU+juGB4sOABzqdCxc8CyEN+Ed84MABnE4na9euJTAwsGpooXnz5g0XQkRqbdmyZdx1113Y7Xbmzp1L7969rY4kv6JC0AiUlZUx4rJrCFl3Fl1K/0NkaBNCYiA48q+fCvg1TyWU55t3BiKaw5B7oPeVYLNwqari4mJWrVpFamoqOTk59OrVi8TERLp3747drjW0RLzVxIkT+fTTT2nXrh1vv/227vZ5ERWCRmDmzJm89dZbNG/enCfveIftb0aQtty8wNsDIDDM3JTIHgj8vGOhpwLcpebEQQMIi4Vu/4IBN3rffgUej4fNmzfjdDrZunUr8fHxJCUlMXDgQMLCjrM6k4g0qIKCApKTk8nOzmbEiBGMHTvW6kjyMxUCP/f9999z3XXXYRgGTz/9NImJiQBkb4et78FPKyFnB1SUguE21xWw2cxHCYOjoUVvc42B7hdDeFOLv5hqysjIwOl0snr1agBOP/10EhMTadWqlcXJRATA6XQyduxYbDYbc+fOpU+fPlZHElQI/FppaSlXXHEFBw4c4KKLLmLixIl/+rqKUsjdCWVHzMcV7UHmUwmxHf56pUNfUVJSwtq1a1m2bBmZmZn06NEDh8PBKaecoqEFEQtNnjyZjz76iLZt2/L2228TGqq9062mQuDHnnjiCRYuXEh8fDyLFi2q1URCf+LxeNi2bRtOp5PNmzcTFxeHw+Fg0KBBREREWB1PpFEpLCzk8ssvJysri+HDhzNu3DirIzV6KgR+av369Vx//fUAPPfccwwePNjiRN4nKyuL5cuXs3LlStxuNwMGDCApKYk2bWq/lLOIVN+KFSu4/fbbsdlsvPjii/Tv/8ft16XhqBD4oZKSEoYPH87Bgwf597//zYMPPmh1JK9XXl7OunXrSE1N5cCBA3Tt2hWHw0GfPn0ICPDxcRMRLzZt2jQ++OADWrduzcKFCzUR2EIqBH5oxowZLF68mBYtWrB48WLdDq8hwzDYuXMnqampbNy4kZiYGBITExk8eLD+TovUseLiYpKTk8nMzCQ5OZl77rnH6kiNlgqBn1m7di033XQTALNnz2bgwIEWJ/J9ubm5OJ1OVq5cSWlpKaeeeioOh4P27dtrOWWROrB69eqqTY/mzJnDgAEDLE7UOKkQ+JGSkhIuv/xyMjIy+M9//sN9991ndSS/43K52LBhA8uWLWPfvn2cdNJJJCYm0q9fP4KCgqyOJ+KzHnnkEd577z0SEhJYuHAh4eHhVkdqdFQI/Mijjz7Ku+++S6tWrVi0aJH+QdUzwzDYu3dv1U6NERERDB06lCFDhtCkSROr44n4lF//QHPppZcyYcIEqyM1OioEfuLXt9xeeOEFTjvtNIsTNT75+fmsWLGC5cuXU1BQQL9+/XA4HJx00kkaWhCpBg15WkuFwA9oUo73cbvdbNy4kWXLlrF7927atWtHYmIiAwYM0LavIsfw2GOPsWTJElq2bMmiRYs0KboBqRD4gV8/tvP2229rqMALpaWl4XQ6WbduHUFBQQwZMoShQ4fSrFkzq6OJeJWSkhKGDRtGeno6F198MQ888IDVkRoNFQIfd3RhD4CXXnpJC3v4gMLCQlauXInT6eTIkSP06tULh8NBt27dNLQgwm8XVps1axaDBg2yOFHjoELgw3699OewYcO4++67rY4kNeTxeNi0aROpqals376dVq1a4XA4GDhwoNZ2l0bt10uvL168mMjISKsj+T0VAh82ZcoU/vvf/9K2bVveeustrfDlB9LT00lNTWXNmjXY7XYGDRpEYmIiLVq0sDqaSIOq7uZsUndUCHzUr7cPffnll+nbt6/VkaSOlZSUsGrVKpxOJ4cPH6Znz544HA569uypnRqlUfj19u3PPPMMQ4cOtTqSX1Mh8EEFBQUkJyeTnZ3NlVdeyZ133ml1JKlnHo+HrVu3smzZMrZs2ULz5s1JTExk0KBBmkQqfm3mzJm89dZbNG/enEWLFum6Uo9UCHzQpEmT+OSTT2jXrh1vv/02ISEhVkeSBpaZmYnT6WT16tVUVlYycOBAHA4HCQkJVkcTqVNlZWVcccUVpKWlceGFF5KSkmJ1JL+lQuBjli1bxl133YXdbmfu3Ln07t3b6khisbKyMtasWYPT6SQ9PZ1u3brhcDjo1auXdmoUv7Bp0yauvfZaPB4PM2fOJCkpyepIfkmFwIfk5+eTnJxMTk4Oo0aNqnrcUOQowzDYvn07qamp/PDDD8TGxlbt1BgVFWV1PJFae+aZZ3jjjTdo2rQpS5Ys0fWlHqgQ+JAHH3yQzz//nA4dOvDWW29pxTs5ruzsbJYvX87KlSspLy9nwIABOBwO2rVrZ3U0kRopLy/nyiuvZN++fVxwwQVMnTrV6kh+R4XAR3zzzTeMHz8eu93Oq6++ysknn2x1JPExLpeLdevW4XQ62b9/P507d8bhcNC3b18CAwOtjidyXJs3b+bqq6/G4/HwxBNPcOaZZ1odya+oEPiAI0eOkJycTG5uLmPGjOHWW2+1OpL4OMMw2L17N6mpqXz//fdERkYydOhQhg4dSkxMjNXxRP7SrFmzmD9/PnFxcSxevJjY2FirI/kNFQIfcP/99/Pll1/SqVMnFixYoKECqXN5eXlVOzUWFxfTv39/HA4HHTt21HLK4lVcLhcjRoxgz549nHfeeTzyyCNWR/IbKgRe7quvvmLChAnY7Xbmz59Pz549rY4kfq6iooINGzbgdDrZvXs3HTp0wOFw0L9/f5VR8QpbtmxhzJgxeDweZsyYwdlnn211JL+gQuDFcnNzSU5O5siRI1xzzTVV+4SLNBTDMNi/fz+pqamsX7+e0NBQBg8eTGJiInFxcVbHk0Zs9uzZvPLKKzRp0oTFixfTpEkTqyP5PBUCL2UYBvfeey9ff/01nTt35o033iAoKMjqWNLIFRQUsHLlSpYvX86RI0fo06cPDoeDLl26aGhBGpTL5WLUqFHs2rWLc845h+nTp1sdyeepEHipL7/8kvvvv5+AgABee+01unfvbnUkkd+orKxk48aNOJ1OduzYQevWrXE4HJx22mlaPVMaxLZt2xg9ejSVlZU8+uijnHvuuVZH8mkqBF4oJyeHyy67jIKCAq6//vqqfcFFvNmBAwdwOp2sXbuWwMDAqp0a4+PjrY4mfuzFF1/k5ZdfJiYmhiVLlmgo6wSoEHgZwzAYP348//vf/+jatSuvvfaahgrE5xQXF1ft1Jidnc0pp5yCw+Gge/fu2qlR6lRFRQWjR49mx44dnHXWWcyYMUPDV7WkQuBlPv/8cx588EECAwN5/fXX6dq1q9WRRE6Ix+Nh8+bNOJ1Otm7dSnx8PA6Hg4EDB2qnRqkTO3bsYOTIkVRWVvLwww9z/vnnWx3JJ6kQeJHs7GySk5MpKCjgxhtv5Nprr7U6kkidy8jIwOl0smbNGgzDqNqpsVWrVlZHEx82d+5c5syZQ3R0NIsXL6ZZs2ZWR/I5KgRewjAMxo0bx7Jly+jevTvz58/XcrLi90pKSli7di2pqakcOnSIHj164HA4OOWUUzS0IDXidrsZM2YM27ZtIykpiSeffFJDBzWkQuAlPvnkEyZNmkRgYCBvvvkmJ510ktWRRBqUx+Nh27ZtOJ1OfvjhB5o2bVq1U2NERITV8cQH7Nq1ixEjRuB2u5kyZQp///vfrY7kU1QIvEBWVhbJyckUFRVxyy23cNVVV1kdScRyWVlZVTs1ut3uqp0a27Zta3U08WKvvPIKs2fPJioqisWLF9O8eXOrI/kMFQKLGYbB2LFjWb58OT179uTVV18lICDA6lgiXqW8vJx169aRmprKgQMH6Nq1Kw6Hgz59+ujfi/xGZWUlV111FVu2bCExMZGnnnpKQwfVpEJgsf/+979MmTKFoKAg3nzzTTp16mR1JBGvZhgGO3fuxOl08v333xMTE8PQoUMZMmSIvucIAHv27OHKK6+koqKCSZMm8c9//tPqSD5BhcBCmZmZJCcnU1xczO23386oUaOsjiTic3Jzc6uGFkpKSqp2auzQoYN+MmzEXnvtNZ577jkiIiJYsmSJFsiqBhUCixiGwe23387KlSvp1asX8+bN06xqkRPkcrnYsGEDqamp7N27l06dOuFwOOjXr58W+GpkKisrueaaa9i8eTODBw/m2WefVUE8DhUCi3zwwQdMmzaN4OBg3n77bdq3b291JBG/YhgGe/fuxel0sn79esLDwxkyZAhDhw7VzniNxL59+7jiiitwuVw89NBD/Otf/7I6kldTIbBARkYGl19+OSUlJYwdO5YRI0ZYHUnE7+Xn57NixQqWL19OQUEBffv2xeFw0LlzZ/3k6McWLFjA008/TXh4OIsXL6Zly5ZWR/JaKgQNzDAMbrnlFtasWUPv3r2ZO3euhgpEGpjb7Wbjxo0sW7aMXbt20a5dOxwOBwMGDCA4ONjqeFKHPB4P1157LZs2bWLgwIE8//zzKoB/QYWggb377rs8+uijhISE8Pbbb9OuXTurI4k0emlpaTidTtatW0dQUBCDBw8mMTFRy9/6ibS0NIYNG4bL5eL+++/nkksusTqSV1IhaEDp6elcfvnllJaWMm7cOIYPH251JBH5ncLCwqqdGnNzc+nVqxdJSUl069ZNP1n6sLfeeouZM2cSHh7OwoULSUhIsDqS11EhaCAej4ebb76ZdevW0a9fP1588UUNFYh4OY/Hww8//MCyZcvYvn07rVq1qtqpMTQ01Op4UgMej4cbbriBDRs2cNppp/H888/re/DvqBA0kMWLFzNjxgxCQ0NZuHAhbdq0sTqSiNRQeno6TqeT1atXY7fbOf3003E4HLRo0cLqaFINBw4cYPjw4ZSVlXHvvfdy2WWXWR3Jq6gQNICffvqJYcOGUVZWxj333ENycrLVkUTkBJWUlLB69WpSU1PJysqiZ8+eJCUl0bNnT/3k6cUWLVrE448/TmhoKIsWLaJ169ZWR/IaKgT1zOPxcOONN7J+/XpOPfVUXnjhBX2zEPEzHo+HrVu3smzZMrZs2UKzZs1wOBwMGjSI8PBwq+PJr/z6e3L//v2ZM2eOvif/TIWgni1cuJAnnniCsLAwFi1apIksIo1AZmYmTqeTVatWUVlZycCBA3E4HPpp1EscPHiQYcOGUVpayvjx47n88sutjuQVVAjqUVpaGsOHD6e8vJwJEyZw6aWXWh1JRBpYWVkZa9aswel0cvDgQbp164bD4aB3797aqdFC77zzDtOnTyckJISFCxdqW21UCOqNx+PhuuuuY+PGjQwcOJBZs2bptpRII2cYBjt27GDZsmX88MMPxMbGkpiYyODBg4mKirI6XqPi8Xi45ZZbWLt2LX369OHll19u9N+jVQjqyZtvvslTTz1FeHg4ixYtolWrVlZHEhEvk5OTg9PpZMWKFbhcLgYMGIDD4dCCZQ0kPT2dYcOGUVJSwl133cUVV1xhdSRLqRDUg/379zN8+HBcLhcPPPAAF198sdWRRMTLuVwuvvvuO1JTU9m3bx+dO3cmKSmJvn37EhgYaHU8v/Xee+/xyCOPEBwczMKFCxt1GVMhqGMej4drrrmGH374gUGDBvHcc89pdTMRqRHDMNizZw/Lli1jw4YNREVFMXToUIYOHUpMTIzV8fyKYRjceuutrF69utHvL6NCUMdef/11nn32WSIiIli8eLEWLBGRE5aXl1e1U2NRURH9+/cnKSmJjh076geOOnDo0CGSk5MpKSnhjjvuYOTIkVZHsoQKQR3as2cPI0aMwOVyMXHiRC666CKrI4mIn6moqGDDhg04nU52795N+/btSUpKon///tqp8QR8+OGHTJ06leDgYN588006duxodaQGp0JQRyorK7nqqqvYsmULQ4YM4ZlnnlFzF5F6ZRgG+/fvJzU1le+++47Q0FCGDBlCYmIicXFxVsfzKYZhcMcdd7BixQpOPvlkXnnllUb3WKgKQR2ZP38+s2bNIjIyksWLFxMfH291JBFpZAoKCli5ciVOp5P8/Hx69+5NUlISXbp00Q8o1ZCVlUVycjJFRUXcdtttjB492upIDUqFoA7s3r2bESNGUFFRQUpKChdeeKHVkUSkkausrGTjxo04nU62b99O69atSUpK4rTTTiMkJMTqeF7r448/JiUlhaCgIN588006depkdaQGo0JwgtxuN1dddRVbt27F4XAwc+ZMNXER8To//fQTqamprF27lsDAQAYNGkRiYqLuZv6OYRjceeedOJ1OevTowauvvtpoHvtUIThB8+bN44UXXiA6OppFixbRvHlzqyOJiBxTcXExq1atwul0kp2dzSmnnILD4aB79+6N9pG7Xzt8+DDJyckUFhZy8803c/XVV1sdqUGoEJyAnTt3MnLkSNxuN1OnTuWCCy6wOpKISI14PB42b96M0+lky5YtxMfHk5SUxMCBAxv1To2ffvopEydOJDAwkAULFtC5c2erI9U7FYJacrvdjBo1ih07dnDmmWfy+OOPa6hARHxeRkYGTqeT1atXYxgGp59+Og6Ho9Etv24YBnfffTfffvst3bp147XXXvP7oQMVglp66aWXeOmll4iOjmbJkiU0bdrU6kgiInWqpKSEtWvXkpqayqFDh+jRowcOh4NTTjmlUQwt5OTkcNlll1FQUMANN9zAddddZ3WkeqVCUAvbt29n1KhRVFZW8sgjj3DeeedZHUlEpF55PB62bduG0+nkhx9+IC4uDofDwaBBg4iMjLQ6Xr354osveOCBBwgICOCNN96ga9euVkeqNyoENVRRUcGoUaPYuXMnZ599No899piGCkSk0cnKymL58uWsXLkSt9tdtVNj27ZtrY5WpwzD4N577+Xrr7+ma9euvPbaawQFBVkdq16oENTQnDlzmDt3LrGxsSxevFirgYlIo1deXs66detITU3lwIEDdOnShaSkJHr37u0X4+65ubkkJydz5MgRrrvuOm644QarI9ULFYIa2Lp1K6NHj8bj8TB9+nTOOeccqyOJiHgVwzDYuXMnTqeT77//nujoaBITExkyZIhPXxO++uorJkyYgN1u5/XXX6d79+5WR6pzKgTV5HK5GDFiBHv27OHcc8/l0UcftTqSiIjXy83NZfny5axYsYLS0lL69++Pw+GgQ4cOPjfcOmHCBL766itOOukk3njjDb/bTEqFoJqef/55Xn31VeLi4li8eDGxsbFWRxIR8Skul4sNGzaQmprK3r176dSpEw6Hg379+vnEuHxeXh7Jycnk5eVx9dVXc/PNN1sdqU41zkJQUAB790Jxsfn7sDDo2BH+4iK/ZcsWxowZg8fj4fHHH+ess85quKwiIn7IMAz27t2L0+lk/fr1hIeHM2TIEIYMGeLVc7O+/vpr7rnnHux2O/Pnz6dnz55/+rqyI5C3F9yl5u+DIqBJRwjx0ssiNJZC4PHAqlXw8cfw3Xdm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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "edge_widths = [\n",
    "    is_cross_cut_edge(\n",
    "        int(most_probable_result.state[f\"x{i}\"]),\n",
    "        int(most_probable_result.state[f\"x{j}\"]),\n",
    "    )\n",
    "    + 0.5\n",
    "    for i, j in G.edges\n",
    "]\n",
    "node_colors = [int(most_probable_result.state[f\"x{i}\"]) for i in G.nodes]\n",
    "nx.draw_networkx(\n",
    "    G,\n",
    "    pos=pos,\n",
    "    with_labels=True,\n",
    "    alpha=0.8,\n",
    "    node_size=500,\n",
    "    node_color=node_colors,\n",
    "    width=edge_widths,\n",
    "    cmap=plt.cm.rainbow,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4caea675-4b05-4d45-ac0a-d17d1cff7a64",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "tags": []
   },
   "source": [
    "\n",
    "## References\n",
    "\n",
    "<a id='MaxCutWiki'>[1]</a>: [Maximum Cut Problem (Wikipedia)](https://en.wikipedia.org/wiki/Maximum_cut)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  },
  "vscode": {
   "interpreter": {
    "hash": "a07aacdcc8a415e7643a2bc993226848ff70704ebef014f87460de9126b773d0"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
